#include <muduo/net/TcpClient.h>
#include <muduo/net/EventLoop.h>
#include <muduo/net/EventLoopThread.h>
#include <muduo/net/TcpConnection.h>
#include <muduo/net/Buffer.h>
#include <muduo/base/CountDownLatch.h>
#include <iostream>
#include <string>
#include <functional>

class DictClient{
    public:
        DictClient(const std::string& ip, int port):_baseloop(_loopthread.startLoop()),
            _downlatch(1),
            _client(_baseloop,muduo::net::InetAddress(ip,port),"DictClient")
        {
            _client.setConnectionCallback(std::bind(&DictClient::onConnection,this,
            std::placeholders::_1));
            _client.setMessageCallback(std::bind(&DictClient::onMessage,this,
                std::placeholders::_1,
                std::placeholders::_2,
                std::placeholders::_3));

            _client.connect();
            _downlatch.wait();
        }

        bool send(std::string &msg){
            if(_conn->connected() == false){
                std::cout << "连接已经断开，发送数据失败！\n";
                return false;
            } 

            _conn->send(msg);
        }
    private: 
        void onConnection(const muduo::net::TcpConnectionPtr& conn)
        {
            if(conn->connected()){
                std::cout << "连接建立成功！\n";
                _downlatch.countDown();
                _conn = conn;
            } else {
                std::cout << "连接建立失败!\n";
                _conn.reset();
            }
        }

        void onMessage(const muduo::net::TcpConnectionPtr& conn,
            muduo::net::Buffer* buf, muduo::Timestamp)
        {
            std::string res = buf->retrieveAllAsString();
            std::cout << res << std::endl; 
        }

    private:
        muduo::net::TcpConnectionPtr _conn;
        muduo::CountDownLatch _downlatch;
        muduo::net::EventLoopThread _loopthread;
        muduo::net::EventLoop *_baseloop;
        muduo::net::TcpClient _client;
};

int main() {
    DictClient client("127.0.0.1",9090);
    while(1){
        std::string msg;
        std::cin >> msg;
        client.send(msg);
    }
    return 0;
}